#include <stdlib.h>
#include <unistd.h>
#include <syslog.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>

extern void daemonize(const char *cmd); 
extern int already_running(void);

void reread(void){
    /* ... */
}

void sigterm(int signo){
    syslog(LOG_INFO, "got SIGTERM; exiting");
    exit(0);
}

void sighup(int signo){
    syslog(LOG_INFO, "Re-reading configuration file");
    reread();
}

int main(int argc, char *argv[]){
    char    *cmd;
    struct  sigaction sa;

    if((cmd = strrchr(argv[0], '/')) == NULL){
        cmd = argv[0];
    }else{
        cmd++;
    }

    /*
        become a daemon
    */
    daemonize(cmd);

    /*
        make sure only one copy if the daemon is runing.
    */
    if(already_running()){
       syslog(LOG_ERR, "daemon already running");
       exit(1);
    }

    /*
        handle signals of interst.
    */
    sa.sa_handler = sighup;
    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGHUP);
    sa.sa_flags = 0;
    if(sigaction(SIGHUP, &sa, NULL) < 0){
       syslog(LOG_ERR, "can't catch SIGHUP: %s", strerror(errno));
       exit(1);
    }

    sa.sa_handler = sigterm;
    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGTERM);
    sa.sa_flags = 0;
    if(sigaction(SIGTERM, &sa, NULL) < 0){
       syslog(LOG_ERR, "can't catch SIGTERN: %s", strerror(errno));
       exit(1);
    }

    /*
        process
    */
    syslog(LOG_INFO, "uid: %s", getlogin());

    sleep(1000);
    exit(0);
}